package com.atguigu.srb.oss.service.impl;

import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import com.aliyun.oss.model.VoidResult;
import com.atguigu.common.exception.BusinessException;
import com.atguigu.common.results.ResultCodeEnum;
import com.atguigu.srb.oss.service.OssService;
import org.joda.time.DateTime;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;

import javax.annotation.PostConstruct;
import java.io.FileInputStream;
import java.io.InputStream;
import java.util.UUID;

@Service
public class OssServiceImpl implements OssService {
    /*
        spring容器初始化 有三级缓存
     */
    OSS ossClient;
    String endpoint = "oss-cn-shanghai.aliyuncs.com";
    String bucketName = "sh220623-srb";
    @PostConstruct
    public void init(){
        // yourEndpoint填写Bucket所在地域对应的Endpoint。以华东1（杭州）为例，Endpoint填写为https://oss-cn-hangzhou.aliyuncs.com。
        //1、地域节点：桶所在的阿里云oss服务器的域名
        // 阿里云账号AccessKey拥有所有API的访问权限，风险很高。强烈建议您创建并使用RAM用户进行API访问或日常运维，请登录RAM控制台创建RAM用户。
        //2、访问阿里云oss桶的账号密码：  可以使用阿里云账号密码创建子账户，并为子账户分配权限
        //用户登录名称 sh220623@1678273430882151.onaliyun.com
        String accessKeyId = "LTAI5t9jf5WuCoqGmoqApTdt";
        String accessKeySecret = "J72kgjsqMVzTqV3H3OeJfbTVt02bDY";
        // 创建OSSClient实例。
        ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
    }
    @Override
    public String upload(MultipartFile file) {
        try {
            InputStream inputStream = file.getInputStream();//获取用户上传的文件流
            String filePath = file.getOriginalFilename();
            //桶内保存文件的路径+文件名
            //设置唯一文件名 设置年月日目录
            String fileName = System.currentTimeMillis()+"_"+ UUID.randomUUID().toString().substring(0,6)+
                    filePath.substring(filePath.lastIndexOf("."));
            String objectName = "avatar/"+ new DateTime().toString("yyyy/MM-dd/") +fileName;
            // 创建PutObject请求。
            ossClient.putObject(bucketName, objectName, inputStream);
            //获取上传成功的图片地址:便于前端回显
            //https://sh220623-srb.oss-cn-shanghai.aliyuncs.com/avatar/2022/10-29/1667025357877_b3e6f6.jpg
            String imgPath = "http://"+bucketName+"."+ endpoint +"/" + objectName;
            return imgPath;
        } catch (Exception oe) {
           throw new BusinessException(ResultCodeEnum.UPLOAD_ERROR);
        }
    }

    @Override
    public String upload(MultipartFile file, String module) {
        try {
            InputStream inputStream = file.getInputStream();//获取用户上传的文件流
            String filePath = file.getOriginalFilename();
            //桶内保存文件的路径+文件名
            //设置唯一文件名 设置年月日目录
            String fileName = System.currentTimeMillis()+"_"+ UUID.randomUUID().toString().substring(0,6)+
                    filePath.substring(filePath.lastIndexOf("."));
            String objectName = module+"/"+ new DateTime().toString("yyyy/MM-dd/") +fileName;
            // 创建PutObject请求。
            ossClient.putObject(bucketName, objectName, inputStream);
            //获取上传成功的图片地址:便于前端回显
            //https://sh220623-srb.oss-cn-shanghai.aliyuncs.com/avatar/2022/10-29/1667025357877_b3e6f6.jpg
            String imgPath = "http://"+bucketName+"."+ endpoint +"/" + objectName;
            return imgPath;
        } catch (Exception oe) {
            throw new BusinessException(ResultCodeEnum.UPLOAD_ERROR);
        }
    }

    @Override
    public void delete(String imgPath) {
        //从imgPath中截取要删除的文件在桶内的路径
        String objectName = imgPath.substring(("http://"+bucketName+"."+endpoint+"/").length());
        try {
            // 删除文件或目录。如果要删除目录，目录必须为空。
//            VoidResult voidResult =
              ossClient.deleteObject(bucketName, objectName);
//            voidResult.get
        } catch (Exception oe) {
            System.out.println(oe);
            throw new BusinessException(ResultCodeEnum.FILE_DELETE_ERROR);
        }

    }
}
